通过promise对异步操作进行排队

Queuing asynchronous operations via Promises

本文关键字:排队 异步操作 promise 通过      更新时间:2023-09-26

我发现一篇文章解释了如何排队异步操作,但它相当模糊,因为它说如果您从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函数。