Внешняя решимость () не вызывается в предложении then () внутреннего обещания - PullRequest
0 голосов
/ 22 февраля 2019

В следующем коде вызов resolve() в точке (A) не приводит к выполнению условия then() вызова createRequest().Код подходит к точке вызова resolve(), который я подтвердил с помощью оператора печати. ​​

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 */)

[править]

Я добавил предложение catch() к своему createRequest() позвоните, и я был удивлен, увидев, что что-то напечатано, что было странно, потому что печаталось заявление handles:.Я изменил (B) на следующее:

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

, и моя проблема была решена.then() в вызове createRequest выполнялся.Не уверен, почему это происходит.

1 Ответ

0 голосов
/ 22 февраля 2019

Это потому, что 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'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...