我想使用promises,但我有一个回调API,格式如下:
window.onload; // set to callback
...
window.onload = function() {
};
Run Code Online (Sandbox Code Playgroud)
function request(onChangeHandler) {
...
}
request(function() {
// change happened
...
});
Run Code Online (Sandbox Code Playgroud)
function getStuff(dat, callback) {
...
}
getStuff("dataParam", function(err, data) {
...
})
Run Code Online (Sandbox Code Playgroud)
API;
API.one(function(err, data) {
API.two(function(err, data2) {
API.three(function(err, data3) {
...
});
});
});
Run Code Online (Sandbox Code Playgroud)
如果我创建这样的对象:
var obj = {};
obj.prop1 = "Foo";
obj.prop2 = "Bar";
Run Code Online (Sandbox Code Playgroud)
生成的对象总是这样吗?
{ prop1 : "Foo", prop2 : "Bar" }
Run Code Online (Sandbox Code Playgroud)
也就是说,属性是否与我添加它们的顺序相同?
我编写的代码看起来像:
function getStuffDone(param) { | function getStuffDone(param) {
var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) {
// or = new $.Deferred() etc. | // using a promise constructor
myPromiseFn(param+1) | myPromiseFn(param+1)
.then(function(val) { /* or .done */ | .then(function(val) {
d.resolve(val); | resolve(val);
}).catch(function(err) { /* .fail */ | }).catch(function(err) {
d.reject(err); | reject(err);
}); | });
return d.promise; /* or promise() */ | });
} | }
Run Code Online (Sandbox Code Playgroud)
有人告诉我这个被称为" 延迟反模式 "或" Promise
构造函数反模式 ",这个代码有什么不好,为什么这被称为 …
我在循环中进行多个mongoDB查询.并且想要将所有结果作为一个数据数组发送.但是当我简单地使用return来发送数据时,它只返回undefined而不等待所有数据库请求的结果.我也尝试过使用q.moulde但同样的问题.
码:
var getPrayerInCat = function(data){
var result ;
var finalData = [];
if(data.length >0){
data.forEach(function(data2){
var id= data2.id;
Prayer.find({prayerCat:id},function(err,prayer){
var deferred = Q.defer()
if (err) { // ...
console.log('An error has occurred');
// res.send(err);
result= finalData = err
} else {
if(!prayer){
// console.log(data2.id+'--0');
data2.prayersCount = 0;
result = deferred.resolve(finalData.push(data2))
} else {
// console.log(data2.id+'--'+prayer.length);
data2.prayersCount = prayer.length;
// console.log(prayer)
result = deferred.resolve(finalData.push(data2))
} // else for data forward
}
deferred.promise;
})
// deferred.resolve(finalData);
})
/*if(finalData.length > 0) { …
Run Code Online (Sandbox Code Playgroud) 我正在使用 nodejs v8+,它支持默认的异步等待代码风格。
在我的问题中,我试图将所有承诺推送到一个数组中,然后使用 Promise.all 和 await 关键字来获取响应。但问题是,我无法用键映射承诺。
这是示例:
let users = ["user1", "user2", "user3"];
let promises = [];
for(let i = 0; i < users.length; i++){
let response = this.myApiHelper.getUsersData(users[i]);
promises.push(response);
}
let allResponses = await Promise.all(promises);
Run Code Online (Sandbox Code Playgroud)
在这里,我得到了所有响应的所有收集响应,但我实际上想按用户映射它。例如,目前我正在以这种格式获取数据:
[
{
user1 Data from promise 1
},
{
user2 Data from promise 2
},
{
user3 Data from promise 3
}
]
Run Code Online (Sandbox Code Playgroud)
但我想要这种格式的数据:
[
{
"user1": Data from promise 1
},
{
"user2": Data from promise 2
},
{
"user3": …
Run Code Online (Sandbox Code Playgroud) 我有点卡在代码的中间部分。我知道我想要的结局和开始是什么样子,但似乎无法填补空白。
我调用fetch
4 个 API 端点,并将其存储Promises
到相关密钥中,该密钥告诉我它们是什么。
然后我使用循环遍历所有这些for in
,并将所有这些推Promises
入一个数组中,以便我可以调用Promise.all
它们。
将数组成功记录到控制台后,我现在看到数组中充满了包含我的数据的对象。但是,我无法判断哪些数据属于哪个对象键,就像原始对象一样。
有一个更好的方法吗?我确实知道我想在这段代码中使用这个事实Promise.all
;这是我不想让步的事情,因为我正在努力弄清楚如何在不放弃的情况下使这成为可能(现在已经这样做了几个小时)。
在我的代码末尾(这只是我的 React 应用程序中真实示例的伪代码),我只想获取最终对象,并将其推送到state
.
任何帮助表示赞赏。
//imitating React State as an example
const state = {
iliakan: '',
remy: '',
jeresig: '',
}
//put all of the urls in an object with a key-pair value to describe the data
const githubAPI = {
iliakan: 'https://api.github.com/users/iliakan',
remy: 'https://api.github.com/users/remy',
jeresig: 'https://api.github.com/users/jeresig'
}
//create an empty object to …
Run Code Online (Sandbox Code Playgroud)javascript ×5
node.js ×3
promise ×3
bluebird ×2
es6-promise ×2
q ×2
async-await ×1
asynchronous ×1
callback ×1
mongodb ×1
object ×1
reactjs ×1