简体   繁体   中英

promise then is not the function error for Node Promise

I am using async/await to return the Promise , to use it as promoise in node script. When I am trying to make use of the return value as Promise , its giving a error a.then is not a function

here is the sample code

function test () {

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

}

(async ()=> {

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

The Promise constructor function isn't a promise, it is a tool to make promises with.

Even if it was a promise, since you are await ing the return value of test , it would have been resolved into a value before you try to call then on it. (The point of await is that it replaces the use of then() callbacks).

You can await a function that returns a promise like this:

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();

If you change the true to false you can test the "resolve" case.

await retrieves the resolved value from a Promise

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

I've put together two ways of retrieving values from a Promise

using await

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

using .then()

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

Please note that, the async arrow function is removed because there is no await needed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM