2015-11-20 46 views
0

我一直包装了异步和同步功能作为一个PHP开发人员从来不必担心这一点。所以我的问题是这样的 我有一个功能nodejs问题与未定义的承诺nodejs使用Q

function loadPartnerInventory(args,itemIds,offers,offer) { 
var deferred = Q.defer(); 

offers.loadPartnerInventory(args, function(err, items) { 
    var checkItems = []; 
    var len = items.length; 
    for(var i = 0; i < itemIds.length; i++) { 
     for(var j = 0; j < items.length; j++) { 
      if (itemIds[i] == items[j].id){ 
       //console.log('Pushed: ' + items[j].name); 

       checkItems.push({ 
        itemname: items[j].market_name, 
        market_hash_name: items[j].market_hash_name, 
        steamid: offer.steamid_other, 
        tradeofferid : offer.tradeofferid 
       }); 

      } 
     } 
    } 
    deferred.resolve(checkItems); 
}); 

return deferred.promise; 
} 

function loadMyInventory(args,itemIds_g,offers,offer) { 
var deferred = Q.defer(); 
offers.loadMyInventory(args, function(err, itemsg) { 

    var checkItems_g = []; 
    var len = itemsg.length; 
    for(var i = 0; i < itemIds_g.length; i++) { 
     for(var j = 0; j < itemsg.length; j++) { 
      if (itemIds_g[i] == itemsg[j].id){ 
       console.log('Pushed: ' + itemsg[j].name); 

       checkItems_g.push({ 
        itemname: itemsg[j].market_name, 
        market_hash_name: itemsg[j].market_hash_name, 
        steamid: offer.steamid_other, 
        tradeofferid : offer.tradeofferid 
       }); 

      } 
     } 
    } 
    deferred.resolve(checkItems_g); 
}); 
return deferred.promise; 
} 

function getPartnerInventory(offers, offer, itemIds, itemIds_g) { 
var p1 = loadPartnerInventory({ 
    partnerSteamId: offer.steamid_other, 
    appId: 730, 
    contextId: 2 
},itemIds,offers,offer); 

var p2 = loadMyInventory({appId: 730, contextId: 2},itemIds_g,offers,offer); 

return Q.all(p1, p2).spread(function(checkItems, checkItems_g) { 
    return { 
     checkItems: checkItems, 
     checkItems2: checkItems_g 
    }; 
}); 
} 

IM这样做是为了得到结果,但不知何故,第二prommiss是不确定的,我不明白为什么。

getPartnerInventory(offers,offer,itemIds,itemIds_G).then(function(response) { 
           console.log(response); 
           //console.log(response); 

          }); 

checkitems正确返回但checkitems 2未定义。

cosole日志:

{ checkItems: 
{ itemname: 'Operation Breakout Weapon Case', 
market_hash_name: 'Operation Breakout Weapon Case', 
steamid: '76561198245431424', 
tradeofferid: '859881697' }, 
checkItems2: undefined } 
Pushed: Glock-18 | Wraiths 

因为可以看到它的undiefined,但似乎它做

回答

0

后,您无法解决同样的承诺两次新增的项目。您应该将这两种方法封装在不同的承诺中,然后使用Q.all(),这将返回一个新的承诺,只有在两个承诺都成功解决后才能解决。例如:

function mapOfferItem(item, offer) { 
    return { 
    itemname: item.market_name, 
    market_hash_name: item.market_hash_name, 
    steamid: args.offer.steamid_other, 
    tradeofferid : args.offer.tradeofferid 
    }; 
} 

function loadPartnerInventory(args) { 
    var deferred = Q.defer(); 

    offers.loadPartnerInventory(args, function(err, items) { 
    var checkedItems = items.filter(function(item) => { 
     return args.itemIds.indexOf(item.id) >= 0; 
    }).map(function(item) { 
     return mapOfferItem(item, args.offer); 
    }); 
    deferred.resolve(checkedItems); 
    }); 

    return deferred.promise; 
} 

function loadMyInventory(args) { 
    var deferred = Q.defer(); 

    offers.loadMyInventory(args, function(err, items) { 
    var checkItems = items.filter(function(item) { 
     return args.itemIds_g.indexOf(item.id); 
    }).map(function(item) { 
     return mapOfferItem(item, args.offer); 
    }); 
    deferred.resolve(checkItems); 
    }); 

    return deferred.promise; 
} 

function getPartnerInventory(offers, offer, itemIds, itemIds_g) { 
    var p1 = loadPartnerInventory({ 
    partnerSteamId: offer.steamid_other, 
    appId: 730, 
    contextId: 2 
    }); 

    var p2 = loadMyInventory({appId: 730, contextId: 2}); 

    return Q.all([p1, p2]).spread(function(checkItems, checkItems_g) { 
    return { 
     checkItems: checkItems, 
     checkItems2: checkItems_g 
    }; 
    }); 
} 

然后可以使用这样的功能:

getParentInventory(offers, offer, itemIds, itemIds_g) 
    .then(function(checkItems) { 
    console.log(checkItems); 
    // should print {checkItems: [...], checkItems2: [...]} 
    }); 
+0

由于生病给一个去让更多的SENCE你说对了,如果都工作地生病马克回答正确;) – user2391327

+0

没问题,让我知道如果它的工作:) – jeremija

+0

我已经更新了答案,以简化您的逻辑使用EcmaScript 5数组函数,如[filter()](https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Reference/Global_Objects/Array/filter)和[map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)。不幸的是我无法测试它。如果您使用较新版本的Node,则可以使用[箭头函数](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)来使代码更加丰富紧凑。 – jeremija