【问题标题】:Bluebird Promises and JSON.parse on an Array数组上的 Bluebird Promises 和 JSON.parse
【发布时间】:2017-04-03 05:49:20
【问题描述】:

我想访问 JSONOBJECT 中的 JSONARRAY。但是在 Bluebird Promises 之后,我无法在“arrayOfResults”的条目上进行 JSON.parse。如果我这样做,代码就会陷入僵局。数据库是redis。请帮忙:)

更新:该部分之后的代码导致死锁,对不起:(

var JSONOBJECT = {
 "A":DATA, 
 JSONARRAY :[{A:x}, {B:C}]
};

db.set(SOMEID, JSON.stringify(JSONOBJECT));



function somefunction(ArrayOfIDS){
		var promises = [];
		for (var i = 0; i < ArrayOfIDS.length; i++) {
			promises.push(db.getAsync(ArrayOfIDS[i]));
	        }
		return Promise.all(promises).then(function(arrayOfResults) {
			for (i = 0; i < arrayOfResults.length; i++) {
				//THIS IS NOT WORKING, but i need to parse it back to JsonObject
				//var JSONOBJECT = JSON.parse(arrayOfResults[i]);
                
                //The JSONOBJECT below only contains the string of the JSONOBJECT
				var JSONOBJECT = arrayOfResults[i];
                //So this line below is not working
                                var JSONARRAY = JSONOBJECT.JSONARRAY;
			}
			//SOME MORE CODE
			return SOMETHING;
		});
};

【问题讨论】:

  • 你能告诉我们,arrayOfResults 包含什么吗?
  • 它包含了JSON.stringify(JSONOBJECT)的值,所以arrayOFResults的每个Entry中只有一个JSONOBJECT的字符串:(
  • @Arzan0 我很确定你没有死锁,因为这里的依赖图中没有循环。很可能结果不是正确的 json 字符串,因此 JSON.parse 失败并且 promise 被拒绝。尝试处理承诺拒绝,至少将它们记录到控制台。
  • “这不工作”到底指的是什么?如果您只是解析 JSON 字符串,您会得到什么错误?有什么问题?

标签: javascript json node.js promise bluebird


【解决方案1】:

arrayOfResults 包含承诺结果,而不是值,因此您不能应用 JSON.parse 之类的同步方法

试试这个功能

function somefunction(ArrayOfIDS) {
    return Promise.map(ArrayOfIDS, function(ID, index){
        return Promise.resolve()
            .then(function(){
                return db.getAsync(ID);
            })
            .then(function(JSONOBJECT) {
                return {
                    obj: JSON.parse(JSONOBJECT),
                    index: index
                }
            })
    })
    .then(function(ARRAYOFJSONOBJECTS){
        return SOMETHING;
    });
}

【讨论】:

  • 如何获得“somefunction”的最后一个返回值?
  • 如果我使用 JSON.parse 仍然是一个死锁。函数 db.getAsync(ID) 返回 JSONOBJECT 的字符串。
  • @Arzan0 你能发布实际代码吗?你在做什么?我不明白
  • 那部分之后的代码出现了死锁,对不起:(
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 2017-03-04
  • 2014-07-11
  • 1970-01-01
  • 2017-04-04
  • 2016-09-24
  • 2015-10-08
  • 2015-04-17
相关资源
最近更新 更多