【问题标题】:JS ES6 Promises are getting called without reasonJS ES6 Promises 被无缘无故地调用
【发布时间】:2018-02-15 07:04:28
【问题描述】:

我对 Promise 和 npm "streamToPromise" 包有疑问。 首先 - 我有不同的功能,当所有这些功能都解决后,我想调用最后一个功能。但是在我的代码中 - 它只是在没有经过“streamToPromise”中的 iffs 的情况下被执行

var func1 = new Promise(function(resolve,reject){ 
// get's executed without reason
  // do something
  if(var1 && var2){
    resolve(true);
  }
});

var func2 = new Promise(function(resolve,reject){
  // get's executed without reason
  // do more
  if(var3 && var4){
    resolve(true);
  }

});

streamToPromise(stream).then(function (operation) {
  // do more 
 // doesn't get executed
  if(varX && varY){
    func1()
    .then(func2)
    .then(func3)
    .then(funcFinal)
    .catch(function (error) {
      // console log error
    }
  }
}

我已经尝试理解 Promises 几个星期了,但总是有一些我不理解的错误。非常感谢您的帮助!

【问题讨论】:

    标签: javascript node.js stream promise es6-promise


    【解决方案1】:

    你已经创建了func1func2等,但它们不是函数,它们是立即“创建”的承诺,因此new Promise执行器中的代码已被立即调用

    你想让 func1 等成为函数,然后让它们成为函数

    var func1 = function() {
        return new Promise(function(resolve, reject) {
            // get's executed without reason
            // do something
            if (var1 && var2) {
                resolve(true);
            }
        });
    }
    
    var func2 = function() {
        return new Promise(function(resolve, reject) {
            // get's executed without reason
            // do more
            if (var3 && var4) {
                resolve(true);
            }
        });
    }
    
    streamToPromise(stream).then(function(operation) {
        if (varX && varY) {
            func1()
                .then(func2)
                .then(func3)
                .then(funcFinal)
                .catch(function(error) {
                        // console log error
                    }
                }
        }
    });
    

    【讨论】:

      【解决方案2】:

      func1func2 实际上不是函数;它们是您立即创建的承诺。

      您可能希望那些是返回承诺的函数。

      您也不想打电话给他们并将他们的结果传递给then();你想自己传递函数。

      【讨论】:

      • 我试过了 - 但问题是它甚至没有达到这一点。这些函数之前被调用过。这是因为我将 Promise 函数创建为 vars 并且它们被初始化了吗?
      • @TimoReichert:你试过什么?你有两个不同的错误,每一个都会导致这个问题。
      • 我把函数改成了函数的名字。所以我不能提前创造那些承诺?有替代方案吗?我应该只在它们之上创建函数和承诺吗?抱歉,如果这听起来很愚蠢,但我很难理解 Promise 是如何工作的。
      • @TimoReichert:承诺只是一个对象。您传递给new Promise() 的回调会立即运行。如果你想要一个返回 Promise 的函数(而不是立即创建 Promise),你需要创建一个函数。
      【解决方案3】:

      原因是方法被调用的方式

      要么用这种方式

      .then(function () {
      return func2();
      }).then( ...) 
      

      在 func2() 和 func3() 中你需要返回 Promise 对象

      或使用(不带括号)

      .then(func2).then(func3)
      

      【讨论】:

      • 我试过了 - 但问题是它甚至没有达到这一点。这些函数之前被调用过。这是因为我将 Promise 函数创建为 vars 并且它们被初始化了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2020-08-17
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多