使用 es6 的 Node 正确实现承诺

Correct implementation promises with Node using es6

我从 Node 开始,但我不知道如何在这个例子中实现承诺

节点 : v6.1.0

ES6

我有这个代码

const fs = require('fs')
const request = require('request')
const arrPokemon = new Array('charmander','nidorino')

function writeResponse(name, content) {
    return new Promise(function (resolve, reject) {
         fs.writeFile(name, content, function (err, res) {
             if (err) return reject(err)
             return resolve(res)
         })
    })
}

pokemon = (name) => {
    return new Promise(function (resolve, reject) {
        request('http://pokeapi.co/api/v2/pokemon/'+name, function (err, res, body) {
            if (err) return reject(err)
            console.log(body)
            return resolve(body)
        })
    })
}

function readPokemon() {
    for(var i= 0; i < arrPokemon.length; i++) {
        console.log(arrPokemon[i])
        pokemon(arrPokemon[i])
        .then(responses => writeResponse('pokemon-' + i, responses))
        .catch(err => console.log(err))
    }
}

readPokemon()

我理解 promises 的概念,但是我很难在这个例子中实现承诺。

错误:

Create a file pokemon-2 but I need create a file for each response

错误是异步执行与for循环配对导致的。当执行到调用 writeResponse 的部分时,循环变量 i 已递增到 2,因此所有 writeResponse 调用实际上都将 arrPokemon[2] 作为其第一个参数。

为了快速解决问题,您可以尝试这样的操作:

for(let i= 0; i < arrPokemon.length;i++){
  console.log(arrPokemon[i])
  pokemon(arrPokemon[i]).then(responses => writeResponse(arrPokemon[i],responses)).catch(err => console.log(err))
}

(代表 OP 发布答案)

  • 更改function pokemon(){} --> pokemon()=>{}

  • 更改变量 for(var i ...) --> for(let i)