обещание тогда не является ошибкой функции для узла обещания - PullRequest
0 голосов
/ 12 июля 2019

Я использую async/await, чтобы вернуть Promise, чтобы использовать его в качестве продвижения в скрипте узла. Когда я пытаюсь использовать возвращаемое значение как Promise, оно выдает ошибку a.then is not a function

вот пример кода

function test () {

        //do something .......
        //....
        return global.Promise;

}

(async ()=> {

    let a = await test();
    a.then(()=> { console.log('good ')}, (err)=> { console.log()}); 
})();

Ответы [ 3 ]

2 голосов
/ 12 июля 2019

Функция конструктора Promise - это не обещание, это инструмент для выполнения обещаний.

Даже если это было обещание, поскольку вы await возвращаете значение test,оно будет преобразовано в значение, прежде чем вы попытаетесь вызвать then для него.(Смысл await в том, что заменяет использование then() обратных вызовов).

0 голосов
/ 12 июля 2019

await извлекает разрешенное значение из Promise

let a = await test(); // `a` is no longer a Promise

Я собрал два способа получения значений из Promise

с использованием await

(async () => {
    try {
        let a = await test();
        console.log('Good', a);
    } catch(err) {
        console.log(err);
    }
})();

с использованием .then ()

test().then(a => {
    console.log('Good', a);
}).catch(err => {
    console.log(err);        
});

Обратите внимание, что функция стрелки async удалена, поскольку await не требуется.

0 голосов
/ 12 июля 2019

Вы можете ожидать функцию, которая возвращает обещание, например:

function test() {
  return new Promise((resolve, reject) => {
    if (true) {
      reject("Custom error message");
    }
    setTimeout(() => {
      resolve(56)
    }, 200);
  })
}

async function main() {
  try {
    const a = await test();
    console.log(a)
  } catch (e) { // this handles the "reject"
    console.log(e);
  }
}

main();

Если вы измените значение true на false, вы можете проверить случай «разрешения».

...