shopify-api-node中Promise未返回值,无法获取Shopify订单数据
解决Node.js中Shopify订单数据获取后变量未赋值的问题
嘿,这是JavaScript异步代码的经典坑!我来给你把问题拆明白,再给几个实用的解决办法:
为什么第二个代码会返回undefined?
shopify.order.list()是个异步操作(它返回一个Promise),简单说就是这个函数会先发起请求,然后不等Shopify返回数据,就继续执行后面的代码了。你的代码执行顺序是这样的:
- 声明
orders_json,初始值就是undefined - 调用
shopify.order.list(),给Shopify发请求,但这时候请求还在路上 - 直接执行
console.log(orders_json),这时候订单数据还没回来,所以输出undefined - 过了一会儿,Shopify把订单数据返回了,
then里的回调才执行,把orders赋值给orders_json——但这时候之前的console.log早就跑完了
正确的写法有这几种,挑你顺手的用:
方法1:把逻辑放进then回调里
最直接的方式,确保只有拿到数据后才执行相关代码:
var orders_json; shopify.order.list() .then(function(orders){ orders_json = orders; console.log(orders_json); // 这里就能正常输出订单数据了 // 所有需要用orders_json的代码,比如存储数据、处理逻辑,都得写在这里面 });
方法2:用async/await(更清爽,推荐)
如果你的Node.js版本在7.6以上(现在基本都满足),用async/await能让异步代码看起来像同步的,可读性强很多:
async function fetchShopifyOrders() { try { const orders_json = await shopify.order.list(); console.log(orders_json); // 数据到手了,放心用 // 接下来的存储、业务逻辑直接写在这就行 } catch (err) { // 别忘了加错误处理,不然请求失败会崩 console.error("获取订单出错啦:", err); } } // 调用这个函数就行 fetchShopifyOrders();
方法3:Promise链式调用(适合多步异步操作)
如果之后还要做其他异步操作(比如把订单存到数据库),链式调用会很清晰:
shopify.order.list() .then(function(orders){ console.log("拿到订单了:", orders); return orders; // 把数据传给下一个步骤 }) .then(function(orders_json){ // 比如这里写存储数据的逻辑 console.log("准备存储的订单数据:", orders_json); }) .catch(function(err){ console.error("处理订单时出错:", err); });
核心要点
记住:异步操作外面的代码不会等它完成,所以绝对不能在then外面或者没加await的地方直接访问还没赋值的异步结果。另外,错误处理一定要加,不然Shopify请求失败的时候,你的程序可能会莫名其妙挂掉。
内容的提问来源于stack exchange,提问作者babaloo
相关产品推荐
相关产品推荐

