【问题标题】:Pass outer variable into promise .then without calling it将外部变量传递给 promise .then 而不调用它
【发布时间】:2018-01-03 22:00:15
【问题描述】:

我有一系列要链接在一起的 promise 函数。我不需要前一个函数的具体结果,所以我没有在 resolve(); 中添加任何内容。我只需要它们按顺序运行。

但是,包含范围中有一个变量,我想将其传递给第一个和第四个(最后一个)promise。当我将它作为参数添加到第三个承诺时,该函数立即运行。

如何将参数传递给链式承诺,而不是在那时调用函数/承诺?

这是我正在尝试做的基础知识:

const containingFunction = function() {
        const varToPass = document.querySelector("#ID").value.trim();
        firstPromise(varToPass)
            .then(secondPromise)
            .then(thirdPromise)
            .then(fourthPromise(varToPass))
            .catch(e =>{
               console.error(e)); 
            } );
    };

第四个承诺:

    const fourthPromise = function(varPassed) {
            return new Promise(function(resolve, reject) {
                do some stuff but only after the thirdPromise has been resolved
                console.log(varPassed)
                resolve();
            });
        };

【问题讨论】:

标签: javascript es6-promise


【解决方案1】:

根据您要如何解决varToPass,您有两种可能性。

拉姆达

使用 @Jaromanda X 描述的 lambda 函数(没有自己作用域的匿名函数):

() => return fourthPromise(varToPass)

这将导致函数保留对变量的引用而不是其值。 varToPass 的值将在第四个Promise 被触发时被评估,而不是在这段代码运行时。

包装器

第二个选项是使用包装器,即返回函数的函数:

function fourthPromise(varToPass) {
    return function() {
        return new Promise(function(resolve, reject) {
            do some stuff but only after the thirdPromise has been resolved
            console.log(varToPass)
            resolve();
        });
    };
}

在这种情况下,传递的变量的值是在代码运行时计算的,而不是在调用回调时计算的。

如果没有更多上下文,我们无法判断哪个选项更适合您的情况。

【讨论】:

  • 澄清一下,使用包装器评估变量,但未调用第四个承诺的其余部分?
  • 正确。该函数创建一个新范围,其中涉及创建varToPass 的副本。如果它是原始类型(数字、字符串等),则复制该值,否则(对象、列表等)将创建对该对象的新引用。
【解决方案2】:

很简单的改变

const containingFunction = function() {
    const varToPass = document.querySelector("#ID").value.trim();
    firstPromise(varToPass)
        .then(secondPromise)
        .then(thirdPromise)
        .then(() => fourthPromise(varToPass))
        .catch(e =>{
           console.error(e)); 
        } );
};

【讨论】:

  • @jarmandaX 为什么将第四个承诺放在另一个函数中会阻止它在第三个承诺运行之前被调用?我只是想了解其中的区别
  • 您将函数传递给 .then - 而在您的代码中,您将调用函数的结果传递给 .then
  • 最好的做法是对 secondPromise 和 thirdPromise 执行相同的操作,即使它们不使用任何参数?
  • @Somethingismissing no
  • @Somethingismissing - 我喜欢让代码尽可能简单,所以如果不需要做某事,就不要做:p
猜你喜欢
  • 2021-11-01
  • 2016-03-02
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2020-08-21
  • 1970-01-01
相关资源
最近更新 更多