then() 如何提供它的参数

How does then() feed its parameters

试图让我的头脑围绕 Javascript 承诺。我正在试验 Q 库。我有一些代码可以输出我期望的结果,但我不确定它是如何工作的:

'require strict';

var Q = require("q");

function getFirst(){
    var deferred = Q.defer();
    var first = 5;
    console.log("getting first: " + first);
    deferred.resolve(first);
    return deferred.promise;
}

function addSecond(first){
    var deferred = Q.defer();
    var second = 10;
    console.log("adding second: " + second);
    var result = first + second;
    deferred.resolve(result);
    return deferred.promise;
}

function printResult(result) {
    console.log("result is + " + result);
}

getFirst()
.then(addSecond)
.then(printResult);

运行 在 Node 中我得到:

getting first: 5
adding second: 10
result is + 15

我比较疑惑的是addSecond和printResult最终调用时是怎么获取参数的? “5”是如何神奇地变成 addSecond 的?如果 addSecond 需要一大堆参数怎么办?

感谢您阐明这一点。

addSecond 的参数来自:

deferred.resolve(first);

所以值为 5

printResult 从以下位置获取参数:

var result = first + second;
deferred.resolve(result);

所以值为 first + second


您可以试验一下。将要传递给函数的值传递给 .resolve() 并查看它的变化。基本上,.resolve 就像一个指向您传递给 .then() 的函数的指针。

您添加到 deferred.resolve([params]) 的任何参数都会发送到延迟函数或 DoneCallback(.then(function) 中指示的函数)。 它确实接受多个参数 (https://api.jquery.com/deferred.resolve/).

当您调用 promise 时,它​​会等到基础函数 "resolves",然后调用下一个函数,将已解析的值作为参数传递(此值在 deferred.resolve(first) 上解析)。然后新函数 return 是否承诺重复循环,否则只需调用下一个传递 returned 值的函数。

如果需要传递多个参数,可以return一个数组。

出色的承诺介绍:

您的 addSecond 代码可以简化为

function addSecond(first){
    var second = 10;
    console.log("adding second: " + second);
    return first + second;
}