通过promise对异步操作进行排队
Queuing asynchronous operations via Promises
我发现一篇文章解释了如何排队异步操作,但它相当模糊,因为它说如果您从then
函数返回一个"类似承诺"的对象,它将使下一个then
等待它完成。我不知道"类似承诺"是什么意思,所以我尝试了一下(见下面的代码),它可以工作,但我不确定这是否是正确的方式去做这件事。
let promise = new Promise(function (resolve, reject) {
someAsyncOperation(function () {
resolve({done: true});
});
});
promise.then(function (val) {
return new Promise(function (resolve, reject) {
anotherAsyncOperation(function () {
resolve({doneAgain: true});
});
});
}).then(function (val) {
// This only occurs after the anotherAsyncOperation is done
});
是的,你的代码应该创建一个承诺,直到anotherAsyncOperation
完成。
let promise = new Promise(function(resolve, reject) {
console.log('1');
someAsyncOperation(function() {
resolve({ done: true });
});
}).then(function(val) {
// val == { done: true }
return new Promise(function(resolve, reject) {
console.log('2');
anotherAsyncOperation(function() {
resolve({ doneAgain: true });
});
});
}).then(function(val) {
// val == { doneAgain: true }
console.log('3');
});
@Amit的意思是你可以创建一个回调风格的异步操作的"承诺"版本。
function promisify( operation ) {
return function( ) {
return new Promise(function(resolve, reject) {
operation(function( err, val ) {
if (err) reject(err);
else resolve(val);
});
});
};
}
var someAsyncOp = promisify( someAsyncOperation );
var anotherAsyncOp = promisify( anotherAsyncOperation );
console.log('1');
var promise = someAsyncOp()
.then(function( val ) {
console.log('2');
return anotherAsyncOp();
})
.then(function( val ) {
console.log('3');
});
注意,有一些promise库具有比我展示的那个更好的promisify
函数。
相关文章:
- 如何指示“;熟度;在异步操作中
- 使用jquery更改异步操作中的文本值
- 节点.js中的嵌套异步操作
- 阻止chrome.webRequest.onBeforeSendHeaders侦听器中的异步操作
- 节点.js和表达式:如何在异步操作后返回响应
- 无法在Redux中测试异步操作
- 当我在异步操作Redux上开始单元测试时,没有定义错误承诺
- 循环中的异步操作
- 回流如何侦听异步操作已完成
- 我们可以使用Jasmine在测试中执行异步操作吗
- jQuery:如何检查以确保所有异步操作都已完成
- JavaScript ES6 承诺在 while 循环中调用异步操作
- 请等待异步操作 (firebase) 调用完成,然后再加载网页
- 具有 Javascript 同步接口的异步操作
- 如何在异步操作期间使 Express.js 日志错误
- 如何在 $ 中执行异步操作.延迟,然后失败过滤回调并传递回成功链
- Redux 中的异步操作
- Redux - 智能组件 - 在挂载组件之前如何处理异步操作
- Javascript 中的异步操作
- 通过promise对异步操作进行排队