在API调用返回后,Node.js会做一些事情

我正在使用aws-lib npm软件包调用Amazon产品API。 我试图得到这个调用的结果,然后将这些信息保存到我的数据库中,我一直遇到的问题是,如果我尝试将调用的结果设置为产品我得到未定义,因为API调用尚未完全返回。 我试图使用callback和承诺,以确保API结果完全返回之前,我做任何事情,但我不能让它的工作。

这是我的代码的当前状态

var aws = require('aws-lib'); var host = "http://webservices.amazon.co.uk/onca/xml" var prodAdvOptions = { host: "webservices.amazon.co.uk", region: "UK" }; // provide credentials var prodAdv = aws.createProdAdvClient(myKey, myPass, myId, prodAdvOptions); .post(function(req, res) { // Options for the Amazon API var options = { ItemId: req.body.itemId, ResponseGroup: "OfferFull, ItemAttributes", Condition: "New", MerchantId: "Amazon" } getInfo(options, saveProduct, res); } function getInfo(options, saveProduct, res){ // Make call to the API prodAdv.call("ItemLookup", options, function(err, result) { //create new product var product = new Product(); product.name = result.name //assign lots more things to the product - these will return undefined which is the problem saveProduct(product); }) }; function saveProduct(product){ // save product to the database }; 

这是使用aws-lib调用API

 exports.init = init; function init(genericAWSClient) { return createProdAdvClient; function createProdAdvClient(accessKeyId, secretAccessKey, associateTag, options) { options = options || {}; var client = genericAWSClient({ host: options.host || "ecs.amazonaws.com", path: options.path || "/onca/xml", accessKeyId: accessKeyId, secretAccessKey: secretAccessKey, secure: options.secure }); return { client: client, call: call }; function call(action, query, callback) { query["Operation"] = action query["Service"] = "AWSECommerceService" query["Version"] = options.version || '2009-10-01' query["AssociateTag"] = associateTag; query["Region"] = options.region || "US" return client.call(action, query, callback); } } } 

我想我没有正确使用callback,或者需要另外一个将结果分配给产品,但是不能解决我要去哪里的问题。

感谢您的帮助,我一直在这个问题上敲了两天。

在没有承诺的情况下,最初看看发生了什么事情可能会更容易一些,然后在达成谅解之后使用承诺。

该scheme的一个select是:

  1. 发出POST请求并调用callback函数
  2. getInfo被调用
  3. prodAdv被调用,这是ansynchronous,这意味着在aws调用完成后,必须提供callback函数。
  4. 在那个调用saveProduct被调用的时候,另一个asynchronous函数。 saveProduct必须注册一个callback,以便在完成对数据库的调用时可以执行一些操作。
  5. 在这个callback问题res.send

  api.post('somePost', function(req, resp) { makeAWSCallAsync(params, function(err, awsRespProducts) { saveProductsAsync(awsRespProducts, function(err, dbResp) { // db call has been completed resp.send(); }); }); }); 

这是非常光秃的骨头,一路上可能应该检查错误。 一旦这个工作,你可以重构使用承诺,这将删除嵌套的callback。