使用es6的Node正确实现承诺

时间:2016-06-10 17:43:43

标签: node.js ecmascript-6 es6-promise

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

  • 读数组pokemons
  • 使用api pokemon
  • 请求数据
  • 在新文件中写回复

节点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的概念,但在本例中我很难实现承诺。

错误:

  

创建文件pokemon-2但我需要为每个响应创建一个文件

2 个答案:

答案 0 :(得分:0)

错误是由与for循环配对的异步执行引起的。当执行到达您调用writeResponse的部分时,循环变量i已增加到2,因此所有writeResponse调用都有效地将arrPokemon[2]作为其第一个参数。< / p>

为了快速解决问题,你可以尝试这样的事情:

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))
}

答案 1 :(得分:0)

(代表OP发表答案)

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

  • 更改var for(var i ...) - &gt; for(let i)