我可以强制解决承诺以等待 javascript 中的结果吗?
Can I force the resolution of a promise to await results in javascript?
这个问题有点学术性,因为我没有真正的需要来做这个。
我想知道我是否可以强制将承诺解析为函数的返回值,这样函数调用者不知道函数包含承诺的异步操作.
在 .NET 中,我可以通过在 Task[]
或 return Task.Result
上使用函数来做这样的事情,这会导致调用者等待任务完成,而调用者不知道或不关心已使用任务完成工作。
如果您使用的是 ES6,则可以使用生成器来编写这样的代码。它基本上接近 'blocking' 的承诺,所以你有一个 long-运行 方法的外观,它只是 returns 你想要的值,但 async/promises 生活在封面。
let asyncTask = () =>
new Promise(resolve => {
let delay = Math.floor(Math.random() * 100);
setTimeout(function () {
resolve(delay);
}, delay);
});
let makeMeLookSync = fn => {
let iterator = fn();
let loop = result => {
!result.done && result.value.then(res =>
loop(iterator.next(res)));
};
loop(iterator.next());
};
makeMeLookSync(function* () {
let result = yield asyncTask();
console.log(result);
});
此处提供更多解释和来源:http://www.tivix.com/blog/making-promises-in-a-synchronous-manner/
Here is the code 在 Babeljs.io
上编译
这个问题有点学术性,因为我没有真正的需要来做这个。
我想知道我是否可以强制将承诺解析为函数的返回值,这样函数调用者不知道函数包含承诺的异步操作.
在 .NET 中,我可以通过在 Task[]
或 return Task.Result
上使用函数来做这样的事情,这会导致调用者等待任务完成,而调用者不知道或不关心已使用任务完成工作。
如果您使用的是 ES6,则可以使用生成器来编写这样的代码。它基本上接近 'blocking' 的承诺,所以你有一个 long-运行 方法的外观,它只是 returns 你想要的值,但 async/promises 生活在封面。
let asyncTask = () =>
new Promise(resolve => {
let delay = Math.floor(Math.random() * 100);
setTimeout(function () {
resolve(delay);
}, delay);
});
let makeMeLookSync = fn => {
let iterator = fn();
let loop = result => {
!result.done && result.value.then(res =>
loop(iterator.next(res)));
};
loop(iterator.next());
};
makeMeLookSync(function* () {
let result = yield asyncTask();
console.log(result);
});
此处提供更多解释和来源:http://www.tivix.com/blog/making-promises-in-a-synchronous-manner/
Here is the code 在 Babeljs.io
上编译