在我的代码中,我正在使用promises向模型数据库(使用mocky)发出GET请求。
我希望在解析响应之后得到一个JSON对象,但我得到了别的东西。
问题是我的代码由于某种原因返回Promise
(我认为)而不是它应该的JSON值。
let request = require("request");
let Promise = require("promise");
let HTTPGet = Promise.denodeify(request);
let dbData =
HTTPGet("http://www.mocky.io/v2/57fbba4c0f0000f4124fd451")
.then(response => JSON.parse(response.body));
此代码将dbData
设置为等于Object {_45: 0, _81: 1, _65: Object, _54: null}
。
但是,以下代码将给出预期结果:
let request = require("request");
let Promise = require("promise");
let HTTPGet = Promise.denodeify(request);
let dbData;
HTTPGet("http://www.mocky.io/v2/57fbba4c0f0000f4124fd451")
.then(response => {dbData = JSON.parse(response.body);});
then
语句返回Promise,或者通过return
返回promise的结果。因为在第一个代码片段中我返回一个JSON对象,为什么dbData
不等于该对象?答案 0 :(得分:2)
根据我对promises的理解,then语句返回Promise,或者返回promise的结果。
没有。 总是返回一个承诺。
回调函数的返回值(或缺少值)将确定传递给返回的promise的then
处理程序的内容。
如何修复第一个代码段(以更优雅的方式?)
处理then
处理程序内的数据(或返回promise并在稍后的then
处理程序中处理数据)。
答案 1 :(得分:0)
then
does ALWAYS return a promise. Your second code snippet is the way to go in this case.
答案 2 :(得分:-1)
'use strict';
let request = require("request");
let Promise = require("promise");
let HTTPGet = Promise.denodeify(request);
let co = require('co');
let dbData;
const gen = co(function *(){
let response = yield HTTPGet("http://www.mocky.io/v2/57fbba4c0f0000f4124fd451");
dbData = yield JSON.parse(response.body);
});
gen.then(function(){
//dbData is available
console.log(dbData);
})