Обещание в функции, получившей ошибку, не является ошибкой функции - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь напечатать вставку 10 один за другим в массив

const obj = []
const delay = (timer, num) => setTimeout(() => Promise.resolve(num), timer)

_.times(10).map(o => {

  delay(1000, o).then(num => console.log(obj.push(num)))

})

https://jsfiddle.net/287b4daz/

Но я получил задержку. Тогда это не ошибка функции? или мне даже не нужно использовать Promise, поскольку сам setTimeout уже является обещанием?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Для печати по одному, если вы подразумеваете каждую секунду (согласно комментарию в ответе)

    const obj = []
    const delay = (timer, num) => new Promise(resolve => setTimeout(resolve, timer, num));
    let p = Promise.resolve();
    _.times(10).map(o => {

        p = p
        .then(() => delay(1000, o))
        .then(num => console.log((obj.push(num+1), obj+'')));
    })
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Примечание ... push(num+1), если хотите 1, 1,2 и т. Д., В противном случае это 0, 0,1 и т. Д.

Примечание 2: console.log(x.push(y)) записывает новую длину x , а не массив x - поэтому я положил console.log((obj.push(num+1), obj+'')) note () внутри, с оператором ,, чтобывывод obj+''

на самом деле, чтобы быть понятным, вы должны написать это

    const obj = []
    const delay = (timer, num) => new Promise(resolve => setTimeout(resolve, timer, num));
    let p = Promise.resolve();
    _.times(10).map(o => {
        p = p
        .then(() => delay(1000, o))
        .then(num => {
            obj.push(num+1);
            console.log(obj.join(','))
        });
    })

другая вещь, на которую следует обратить внимание, это то, что .map является неправильным для использования здесь, так как.map используется для сопоставления массива с новым массивом значений - поскольку вы имеете дело с асинхронным кодом, результирующий массив будет, в лучшем случае, массивом неопределенного или массивом обещаний - но поскольку вы не назначаетерезультат .map ни к чему, тогда этот момент довольно спорный

0 голосов
/ 17 мая 2018

Жалуется, что deplay(...).then не является функцией - что deplay не возвращает Обещание. Вам нужно использовать конструктор Promise вместо Promise.resolve:

(также, изменяя deplay на delay:)

const obj = []
const delay = (timer, num) => new Promise(resolve => setTimeout(() => resolve(num), timer))
_.times(10).map(o => {
  delay(1000, o).then(num => console.log(obj.push(num)))
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Если вы хотите связать их вместе, чтобы каждый из них ждал, пока предыдущий файл не будет решен, перед запуском используйте .reduce:

const obj = []
const delay = (timer, num) => new Promise(resolve => setTimeout(() => resolve(num), timer));
Array.from({ length: 10 }, (_, i) => i + 1)
  .reduce((lastPromise, o) => (
    lastPromise
      .then(() => delay(1000, o))
      .then(num => console.log(obj.push(num)))
  ), Promise.resolve())
...