首頁  >  文章  >  web前端  >  如何使用數組迭代透過 Promise 順序傳遞參數?

如何使用數組迭代透過 Promise 順序傳遞參數?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-20 14:57:29794瀏覽

How to Sequentially Pass Parameters through Promises with Array Iteration?

使用陣列迭代透過Promise 順序傳遞參數

考慮下列任務:

var myArray = [1 , 2, 3, 4, 5, 6]<p>function myPromise(num){<br> return new Promise(res => {</p><pre class="brush:php;toolbar:false">window.setTimeout(()=>{
  res(  console.log("done: " + num)  )
},2000)

})
}

}

}
}
}
}
}
}
}

}

}

}

}}

myPromise(myArray[0])

.then(x => myPromise(myArray[1]))

.then(x => myPromise(myArray[2]) )

. then(x => myPromise(myArray[3])) .then(x => myPromise(myArray[4])) .then(x => myPromise(myArray) [5]))

myArray.reduce(
  (p, x) =>
    p.then(() => myPromise(x)),
  Promise.resolve()
)

像上面這樣的程式碼將順序執行Promise。然而,如果陣列是動態填充的,為每個成員執行 myPromise() 就變得具有挑戰性。

有Promises 的可暫停迭代

const forEachSeries = async (iterable, action) => {
  for (const x of iterable) {
    await action(x)
  }
}

forEachSeries(myArray, myPromise)
建立一個執行的「可暫停循環」 myPromise() 順序,等待解決後再繼續:

折疊方法

此方法創建與數組元素一樣多的Promise,但如果這是可以接受的。

const mapSeries = async (iterable, fn) => {
  const results = []

  for (const x of iterable) {
    results.push(await fn(x))
  }

  return results
}

非同步函數方法

const mapSeries = (iterable, fn) => {
  const iterator = iterable[Symbol.iterator]()
  const results = []
  const go = () => {
    const {value, done} = iterator.next()

    if (done) {
      return results
    }

    return fn(value).then(mapped => {
      results.push(mapped)
      return go()
    })
  }

  return Promise.resolve().then(go)
}

非同步函數提供了更具可讀性和記憶體效率的解決方案。

收集回傳值

const myArray = [1, 2, 3, 4, 5, 6]

const sleep = ms =>
  new Promise(res => {
    setTimeout(res, ms)
  })

const myPromise = num =>
  sleep(500).then(() => {
    console.log('done: ' + num)
  })

const forEachSeries = async (iterable, action) => {
  for (const x of iterable) {
    await action(x)
  }
}

forEachSeries(myArray, myPromise)
  .then(() => {
    console.log('all done!')
  })
如果要將回傳值收集為陣列:或者,不支援非同步函數:用法範例使用forEachSeries 方法的可運行程式碼片段:

以上是如何使用數組迭代透過 Promise 順序傳遞參數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn