【问题标题】:Outer resolve() not called within then() clause of inner promise内部 promise 的 then() 子句中未调用外部 resolve()
【发布时间】:2019-02-23 03:31:34
【问题描述】:

在以下代码中,在点 (A) 处调用 resolve() 不会导致执行对 createRequest() 的调用的 then() 子句。代码到达了resolve() 调用的位置,我通过 print 语句验证了这一点。

const request = require('request');

function createRequest() {
  return new Promise(function(resolve, reject) {

    // Setup request
    // ...

    request(options, function(error, response, body) {
      if(!error && response.statusCode == 201) {

        // If the resolve() is done at this point, the then() clause is executed

        uploadFiles(files)
          .then(handles => {
            console.log('handles: ' + handles); // This is printed

            resolve('ok'); // (A) Then clause in call to createRequest is not called
          })
          .catch(reject(requestObj)); // (B) I didn't have this in my initial post
      }
    });
  });
}

function uploadFiles(files) {
  return new Promise(function(resolve, reject) {
    // Upload files
    // ...

    resolve(handles);
  });
}


createRequest()
  .then(message => console.log(message) /* This never executes */)

[编辑]

我在createRequest() 调用中添加了catch() 子句,我很惊讶地看到打印了一些东西,这很奇怪,因为handles: 语句正在打印。我将 (B) 更改为以下内容:

.catch(() => reject(requestObj));

我的问题解决了。对createRequest 的调用中的then() 正在被执行。不知道为什么会这样。

【问题讨论】:

  • 您是否已经在其他地方致电reject()?否则不,如果你得到handles:日志并且resolve('ok')被执行,那么then回调也会运行。
  • 我会看看那个问题,但我不会在任何地方调用 reject()。 handles: 打印应该意味着 resolve() 被执行。
  • 检查 resolve 变量的 agian 所有者,也许您的 resolve (resolve('ok')) 与您的承诺无关。
  • @user2233706 是的,应该。当我执行你的代码时,它对我有用。鉴于您省略了一些事情,我猜罪魁祸首在其他地方。请您发布完整的实际代码吗?

标签: node.js promise


【解决方案1】:

这是因为catch() 需要一个函数,而不是函数调用。即使catch() 子句没有被执行,NodeJS 仍然希望它有一个有效的函数。如果不是,则 NodeJS 拒绝该承诺。例如:

const request = require('request');

function createRequest() {
  return new Promise(function(resolve, reject) {

    var options = {
        url: 'https://www.google.com'
    };

    request(options, function(error, response, body) {
      if(!error && response.statusCode == 200) {    
        uploadFiles()
          .then(handles => {
            resolve('ok');
          })
          .catch(reject('bad')); // (A)
      }
    });
  });
}

function uploadFiles() {
  return new Promise(function(resolve, reject) {
    resolve([1, 2, 3]);
  });
}


createRequest()
  .then(message => console.log(message))
  .catch(message => console.log(message));

这会导致打印“错误”。如果 (A) 被替换为 .catch(() => reject('bad'));,则打印 'ok'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多