node.js 中的并行回调宇宙?
Parallel callback universe in node.js?
我正在尝试在节点中实现 shopify api 并希望同步调用 post 请求,因为我想在 posting 之后检索产品 ID 并将其存储在数组。我正在使用一个名为 deasync 的库作为同步等待循环。该脚本以前可以工作,但突然停止工作。
当我在没有 deasync 循环的情况下记录我的调用时,我看到响应是从 shopify 返回的,但是,当我 运行 我的脚本带有 deasync 循环时,我的标识符保持为 null,并且 deasync 循环不断迭代。我对 node.js 中的异步请求比较陌生。我的标识符变量的范围似乎是正确的。我现在唯一能想象的是,回调发生在一个与我的 while 循环分开的并行 node.js 宇宙中。非常感谢任何帮助,谢谢!
function postProduct(Store, product, variants) {
var identifier = null;
var post_data = {
"product": product
};
Shopify.post('/admin/products.json', post_data, function(err, data, headers) {
identifier = {
id: data.product.id,
price: data.product.price,
variants: variants
};
});
while(identifier === null) {
require('deasync').runLoopOnce();
}
return identifier;
}
所有这些 deasync
解决方案都无法稳定,因为它们依赖于内部引擎实现。
只是尝试学习异步方式。这真的很简单。
原生的简化示例 Promise
:
var products = [
{Store: {}, product: {}, variant: {}},
{Store: {}, product: {}, variant: {}},
];
Promise.all(products.map(postProduct)).then(function(identifiers){
// use identifiers
});
function postProduct(data) {
return new Promise(function(ok, fail){
Shopify.post(...., function(){
//...
ok(identifier);
});
});
}
我正在尝试在节点中实现 shopify api 并希望同步调用 post 请求,因为我想在 posting 之后检索产品 ID 并将其存储在数组。我正在使用一个名为 deasync 的库作为同步等待循环。该脚本以前可以工作,但突然停止工作。 当我在没有 deasync 循环的情况下记录我的调用时,我看到响应是从 shopify 返回的,但是,当我 运行 我的脚本带有 deasync 循环时,我的标识符保持为 null,并且 deasync 循环不断迭代。我对 node.js 中的异步请求比较陌生。我的标识符变量的范围似乎是正确的。我现在唯一能想象的是,回调发生在一个与我的 while 循环分开的并行 node.js 宇宙中。非常感谢任何帮助,谢谢!
function postProduct(Store, product, variants) {
var identifier = null;
var post_data = {
"product": product
};
Shopify.post('/admin/products.json', post_data, function(err, data, headers) {
identifier = {
id: data.product.id,
price: data.product.price,
variants: variants
};
});
while(identifier === null) {
require('deasync').runLoopOnce();
}
return identifier;
}
所有这些 deasync
解决方案都无法稳定,因为它们依赖于内部引擎实现。
只是尝试学习异步方式。这真的很简单。
原生的简化示例 Promise
:
var products = [
{Store: {}, product: {}, variant: {}},
{Store: {}, product: {}, variant: {}},
];
Promise.all(products.map(postProduct)).then(function(identifiers){
// use identifiers
});
function postProduct(data) {
return new Promise(function(ok, fail){
Shopify.post(...., function(){
//...
ok(identifier);
});
});
}