采取同步承诺

时间:2018-03-07 14:10:08

标签: javascript asynchronous es6-promise

我有几个返回promises的javascript函数。我使用.then对这些函数返回的数据进行操作。但是,下面的代码是否保证订单?在result2后会result处理吗?

const test = promiseReturningFunction(data);
test.then((result) => {
  doStuff(result);
});
const test2 = promiseReturningFunction2(data2);
test2.then((result2) => {
  doStuff(result2);
});

或者应该按照以下方式重写:

const test = promiseReturningFunction(data);
test.then((result) => {
  doStuff(result);
}).then(() => {
  const test2 = promiseReturningFunction2(data2);
  test2.then((result2) => {
    doStuff(result2);
  });
});

简而言之:.then阻止了吗?

3 个答案:

答案 0 :(得分:2)

不,.then()没有阻止。在第一个代码段中,您不知道是先处理result还是result2

您可以尝试async functions语法,它更容易理解:

(async () => {
  const result = await promiseReturningFunction(data);
  doStuff(result);
  const result2 = await promiseReturningFunction2(data2);
  doStuff(result2);
})();

await表示在promiseReturningFunction返回的承诺得到解决之前,将停止执行此代码。

答案 1 :(得分:2)

不,独立承诺的then回调顺序无法保证。这对于允许并发处理多个异步任务非常必要。

如果您需要特定订单,则需要明确链接您的承诺回调。

在您的情况下,如果您只需要两个doStuff调用相互运行,但又要同时处理两个promiseReturningFunction,则可以使用

const p1 = promiseReturningFunction(data);
const p2 = test.then(doStuff);
const p3 = promiseReturningFunction2(data2);
Promise.all([p2, p3]).then((stuff, result2) => doStuff(result2));

如果您希望按顺序运行两个promiseReturningFunction,那么您的第二个代码段就可以了。

答案 2 :(得分:0)

第一个是异步的,在result2

之后没有对result1的保证
CREATE TABLE Employee
(
EmployeeID INT IDENTITY,
Name VARCHAR(100) NOT NULL,
.
.
)

请试试这个结构

确保doStaff不是任何I / O操作,否则你让它们承诺可退回的功能