Очередь заданий с асинхронным ожиданием в узле - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть код ниже.Я пытаюсь console.log следующий story только после того, как предыдущий story был напечатан, но он печатает Promise { <pending> }.Я новичок в async и await.Что мне здесь не хватает?

Сервер

const express = require('express')
const async = require("async");
const app = express()
const port = 3000
const time = require('./timeoutFun.js')

const array = [
    {author: 'Bill',
    story: ['This', 'is', 'the', 'first', 'story']},
    {author: 'Frank',
    story: ['Here', 'goes', 'another']},
    {author: 'Tom',
    story: ['Fine', 'another', 'things', 'I', 'wrote']},
    {author: 'Sam',
    story: ['No', 'more', 'writings', 'please']}
]

array.forEach(element => {
    console.log(time.promiseTime(element))
});

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

timeoutFun.js

const time = {
    promiseTime: async function (obj) {
        const randomNum = Math.floor(Math.random() * 5)
        return await new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve(obj.story.toString() + " " + randomNum);
            }, randomNum * 1000);
        })
    }
}

module.exports = time;

1 Ответ

0 голосов
/ 07 декабря 2018
  1. не используйте async function и return promise вместе .. Асинхронные функции возвращают обещание автоматически, просто возвращают конечное значение, но в этом случае, так как вы используете setTimeout, вам нужночтобы вернуть обещание, просто используйте return обещание.

  2. forEach не ожидает выполнения обещаний, поэтому запускает их все, а затем переходит на следующую строку, поэтому используйте for(let e of a){}вместо этого

  3. Вы должны await обещание, например let result = await time.promiseTime(ele), чтобы фактически получить значение, в противном случае вы просто получите обещание (в качестве альтернативы используйте .then(result=>{...}))

const time = {
    promiseTime: function (obj) {
        const randomNum = Math.floor(Math.random() * 5)
        return new Promise(function (resolve, reject) {
            setTimeout(function () {
                resolve(obj.story.toString() + " " + randomNum);
            }, randomNum * 1000);
        })
    }
};


const array = [
    {author: 'Bill',
    story: ['This', 'is', 'the', 'first', 'story']},
    {author: 'Frank',
    story: ['Here', 'goes', 'another']},
    {author: 'Tom',
    story: ['Fine', 'another', 'things', 'I', 'wrote']},
    {author: 'Sam',
    story: ['No', 'more', 'writings', 'please']}
];

async function main(){
  for(let ele of array){
      let result = await time.promiseTime(ele);
      console.log(result);
  };
}
main();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...