使用 es6 的 Node 正确实现承诺
Correct implementation promises with Node using es6
我从 Node 开始,但我不知道如何在这个例子中实现承诺
- 读取阵列神奇宝贝
- 使用 api 宠物小精灵请求数据
- 在新文件中写入响应
节点 : 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)
我从 Node 开始,但我不知道如何在这个例子中实现承诺
- 读取阵列神奇宝贝
- 使用 api 宠物小精灵请求数据
- 在新文件中写入响应
节点 : 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)