如果在Promise中

时间:2017-02-28 08:17:43

标签: javascript node.js callback promise bluebird

我尝试将代码转换为使用回调到Promise,但我从Promise(蓝鸟)获得了一些奇怪的行为

这是主要的逻辑

function func1(callback) {
  func2()
  .then(function(resultFromFunc2) {
    if (resultFromFunc2 === true) {
      callback(null, resultFromFunc2)
    } else {
      return func3()
    }
  })
  .then(function(resultFromFunc3) {
    console.log('Func 3', resultFromFunc3)
    callback(null, resultFromFunc3)
  })
  .catch(function(err) {
    console.log('error', err)
  })
}

func1(function(err, result) {
  console.log('func1', err, result);
})

并且func2func3只是一个简单的解决方案

function func2() {
  return new Promise((resolve, reject) => {
    resolve(true)
  });
}

function func3() {
  return new Promise((resolve, reject) => {
    resolve(true)
  });
}

如果func2解析true代码应该在第一个代码中停止运行,那么我会发现第二个代码被调用

这是终端的结果。

func1 null true
Func 3 undefined
func1 null undefined

如果func2已解决true

,我怎么能停止拨打第二个

3 个答案:

答案 0 :(得分:1)

@Phattahana, 只是在你的问题上发表我的想法。

正如你在答案中所说的那样,你不应该从第一天开始致电callback()。或者您应该准备好更改工作流程并删除2nd then。有很多可能性。

在特定场景中,您希望代码的执行方式与您发布的问题相同(即;如果if condition为真,则不要再调用第二个 - 场景),您可以使用下面的代码

var Promise = require("bluebird");
function func1(callback) {
  func2()
    .then((resultFromFunc2) => {
        return new Promise((resolve, reject) => {
          if (resultFromFunc2 === true) {
            callback(null, resultFromFunc2);
          } else {
            resolve(func3());
          }
        });
    }).then((resultFromFunc3) => {
      console.log('Func 3', resultFromFunc3)
      callback(null, resultFromFunc3)
    }).catch((err) => {
      console.log('error', err)
    });
}

func1((err, result) => {
  console.log('func1', err, result);
  return 1;
});

function func2() {
  return new Promise((resolve, reject) => {
    resolve(false)
  });
}

function func3() {
  return new Promise((resolve, reject) => {
    resolve(true)
  });
}

1st then中的代码应该成为一个单独的promise解析函数,并且只有在不满足条件时才应解析它。

希望清楚。

谢谢,

答案 1 :(得分:0)

问题出在第二个then部分。如果你删除它,一切都应该按预期工作(如果我理解正确)。请参阅下面的代码段 - 如果您更改func2以解决(false),则会调用func3,否则将调用回调。



function func1(callback) {
  func2()
  .then(function(resultFromFunc2) {
    if (resultFromFunc2 === true) {
      callback(null, resultFromFunc2)
    } else {
      return func3()
    }
  })
  .catch(function(err) {
    console.log('error', err)
  })
}

func1(function(err, result) {
  console.log('func1', err, result);
})

function func2() {
  return new Promise((resolve, reject) => {
  console.log('func2');
  resolve(true)
  });
}

function func3() {
  return new Promise((resolve, reject) => {
  console.log('func3')
resolve(true)
  });
}




答案 2 :(得分:0)

我刚刚找到解决方案,

function func1(callback) {
  func2()
  .then(function(resultFromFunc2) {
    if (resultFromFunc2 === true) {
      return 'result from func2'
    } else {
      return func3()
    }
  })
  .then(function(result) {
    callback(null, result)
  })
  .catch(function(err) {
    console.log('error', err)
  })
}

我不应该在第一次回调,因为从第一次回来然后它发送到第二次。

我想念Promise的行为。首先,如果第一个没有返回Promise,我认为它不会调用第二个。