这个问题和 axios 没有任何关系,JavaScript 不允许同步化异步操作,而且只要 JavaScript 维持单线程模型和 setTimeout 的语义,很难预见同步化异步操作的可能性。
考虑如下代码:
var Axios = {};
Axios.request = function (options) {
return new Promise(function (resolve, reject)
{
setTimeout(function () {
console.log(2);
resolve(3);
}, 1000);
});
};
考虑强行同步
var mySync = function (options)
{
return magic syncronous result of Axios.request(options);
};
那么代码
var excl = mySync();
console.log(1);
console.log(excl);
有矛盾。
一方面,根据 Promise 和 setTimeout 的要求,2 必须在 1 之后( Promise 构造器传入的方法立刻执行,因此 setTimeout 发生在 1 之前,同时 setTimeout 在延迟是 1000 的时候保证传入的方法在当前同步代码块结束后才调用)。另一方面,如果要求 excl 得到 3 的值,那么必须先经过 2 ,但 excl 的值在 1 之前得到。
@
DiamondYuan #14 应该注意 node-force-async 得到的结果是错误的——例如传入的方法必须不读取外 scope 的内容,并且返回值会失去类型——这是因为它的原理是同步开一个新的进程执行代码。第二个方法里面是直接从源头杜绝异步。