ES6 Promises - 在承诺链中调用同步函数

ES6 Promises - Calling synchronous functions within promise chain

我目前正在试验 promises 并且有一个非常基本的问题!

在 promise 链中,调用同步函数是否是一种不好的做法?例如:

.then(function(results) {

    if(checkIfResultInMemory(results) === true){
       return getTotalFromMemory()
    }

   return results;

  })

或者我的同步函数是否也应该重构为 return promises?

Within a promise chain, would it be bad practice to call a synchronous function?

不,这根本不是一个坏习惯。这是许多预期和有用的做法之一。

您可以完全自由地调用 promise 链中的同步函数(从 .then() 处理程序中)或异步函数然后 return 一个新的 promise。

当你 return 来自 .then() 处理程序的东西时,你可以 return 一个值(它成为父承诺的解析值)或者你可以 return 另一个 promise(链接到之前的 promise)或者你可以 throw 像 returning 一个被拒绝的 promise(promise 链被拒绝)。

因此,这意味着您可以调用同步函数并从中获取值,或者调用异步函数并获取另一个 promise,然后 return 来自 .then() 处理程序。

所有这些同步事物都是完全合法的,并且每个都有自己的 objective。以下是 .then() 处理程序中的一些同步事件:

// modify resolved value
someAsync().then(function(val) {
    return val + 12;
});

// modify resolved value by calling some synchronous function to process it
someAsync().then(function(val) {
    return someSynchronousFunction(val);
});

// synchronously check the value and throw to change the promise chain
// to rejected
someAsync().then(function(val) {
    if (val < 0) {
        throw new Error("value can't be less than zero");
    }
    return val;
});

// synchronously check the value and return a rejected promise 
// to change the promise chain to rejected
someAsync().then(function(val) {
    if (val < 0) {
        return Promise.reject("value can't be less than zero");
    }
    return val;
});

这是一个异步操作的小例子,return 一个 promise 后跟三个同步 .then() 处理程序,然后输出最终值:

function delay(t, val) {
    return new Promise(function(resolve) {
        setTimeout(function() {
            resolve(val);
        }, t);
    });
}

function increment5(val) {
    return val + 5;
}

delay(500, 10).then(increment5).then(function(val) {
    return val - 3;
}).then(function(final) {
    document.write(final);
});

注意:您通常只希望在有或可能有异步操作时使用 promises,因为如果一切都是同步的,那么纯同步代码执行起来会更快,也更容易编写。但是,如果您已经有至少一个异步操作,您当然可以将同步操作与该异步操作混合使用,并使用 promises 来帮助构建代码。

一个then回调函数应该:

  • return另一个承诺
  • return 同步值(或未定义)
  • 抛出一个同步错误