为什么我的代码会返回一个承诺?

时间:2017-02-02 14:28:45

标签: javascript json node.js promise

背景

在我的代码中,我正在使用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);});

问题

  1. 根据我对promises的理解,then语句返回Promise,或者通过return返回promise的结果。因为在第一个代码片段中我返回一个JSON对象,为什么dbData不等于该对象?
  2. 如何修复第一个代码段(以更优雅的方式?)

3 个答案:

答案 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);
})