Измените функции API Woocommerce на асинхронное / ожидающее использование NodeJS в AWS Lambda. - PullRequest
2 голосов
/ 17 июня 2019

Я хочу изменить пару вызовов API Woocommerce, чтобы каждая функция заканчивалась до того, как будут выполнены следующие функции. Однако я не уверен, как это сделать, не нарушая специфический код Node Woocommerce API.

https://woocommerce.github.io/woocommerce-rest-api-docs/?javascript#create-an-order-note

Как я могу изменить эти две функции POST Woocommerce на Async / Await, чтобы они работали с AWS Lambda?

(я включил существующую функцию ожидания в настоящее время, используемую в AWS Lambda для справки)

const WooCommerceAPI = require('woocommerce-api');
const path = require('path');
const util = require('util');

exports.handler = async (event, context, callback) => {

    // AWAIT EXAMPLE in LAMBDA -- Outputs the /tmp/ contents to the console.
    const readdirs = util.promisify(fs.readdir);
    await readdirs('/tmp/').then((files) => {
        console.log('Check tmp contents')', files);
    }).catch((err) => {
        console.log(err);
    });

    // Update Woocommerce order
    const WooCommerce = new WooCommerceAPI({
        url: process.env.WOOAPI_URL, // Your store URL
        consumerKey: process.env.WOOAPI_KEY, // Your consumer key
        consumerSecret: process.env.WOOAPI_SECRET, // Your consumer secret
        wpAPI: true, // Enable the WP REST API integration
        version: 'wc/v3' // WooCommerce WP REST API version
    });

    //Set order as complete
    const status = { status: 'completed' };
    WooCommerce.post('orders/' + orderId, status, function (err, states, res) {
        if (err) throw err;
        else console.log('Update WooCommerce order with status');
    });

    const data = { note: 'Please check www.example.com for full instructions' };
    WooCommerce.post('orders/' + orderId + '/notes', data, function (err, data, res) {
        if (err) throw err;
        else console.log('Manual WooCommerce Order Note');
    });

};

1 Ответ

2 голосов
/ 17 июня 2019

В WooCommerce есть метод с именем postAsync для асинхронных вызовов, вы можете попробовать что-то вроде:

const status = {
    status: 'completed'
};
const ordersResult = await WooCommerce.postAsync(`orders/${orderId}`, status).then((data) => {
    console.log('Update WooCommerce order with status');
}, (err) => {
    console.log(err);
});

const noteData = {
    note: 'Please check www.example.com for full instructions'
};

const notesResult = await WooCommerce.postAsync(`orders/${orderId}/notes`, noteData).then((data) => {
    console.log('Manual WooCommerce Order Note');
}, (err) => {
    console.log(err);
});

Каждый метод можно использовать по-разному, просто добавив Async к имени метода.

Вы можете посмотреть документы здесь: https://github.com/woocommerce/wc-api-node#promified-methods


Если это не сработает, вы всегда можете использовать его для стекирования вызовов следующим образом:

const status = {
    status: 'completed'
};
WooCommerce.post('orders/' + orderId, status, function(err, states, res) {
    if (err) throw err;
    console.log('Update WooCommerce order with status');
    const data = {
        note: 'Please check www.example.com for full instructions'
    };
    WooCommerce.post('orders/' + orderId + '/notes', data, function(err, data, res) {
        if (err) throw err;
        console.log('Manual WooCommerce Order Note');
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...