如何使用两个回调 return 在 JavaScript 中进行异步调用(WIX corvid)

How to return asynchronous calls in JavaScript with two callbacks (WIX corvid)

下面的异步函数returns 2个回调,所以我对return响应

做了我通常做的
  1. 在获取
  2. 之前添加了return
  3. 在结果 (json.access_token) 前添加 return

但这次 console.log(httpResponse, 'fetch json') 在控制台上未定义,console.log(json.access_token) return 正确的值。

我需要更改什么?

来自客户

GetJSON(NewURLCode).then(httpResponse => {
  console.log(httpResponse, 'fetch json')
}

来自服务器

GetJSON(NewURLCode){
  return fetch("https://accounts.google.com/o/oauth2/token", {
    "method": "post",
    "headers": {
      "Content-Type": 'application/x-www-form-urlencoded'
    },
    'body': data
  }).then((httpResponse) => {
    if (httpResponse.ok) {
      return httpResponse.json();
    } else {
      return Promise.reject("Fetch did not succeed");
    }
  }).then((json) => { 
    console.log(json.access_token)
    return json.access_token
  }).catch(err => console.log(err));
}

与前面的函数不同,下面的函数只有一个 promise 并且 returns 来自客户端的正确对象

客户端

insert_coll ('Token',toInsert).then((ins_result) => {consule.log(ins_result)}

后端

insert_coll{
return wixData.update(myCollection, toUpdate, options)
.then( ( results) => {
let item = results; //see item below
return results

} )
.catch( (err) => {
let errorMsg = err;
} );

} 
}

您可以 return 获取 本身,并在客户端中处理这些内容。 喜欢,

服务器

GetJSON(NewURLCode){
  return fetch("https://accounts.google.com/o/oauth2/token", {
    "method": "post",
    "headers": {
      "Content-Type": 'application/x-www-form-urlencoded'
    },
    'body': data
  });
}

客户端

GetJSON(NewURLCode).then(httpResponse => {
    if (httpResponse.ok) {
      httpResponse.json();
    } else {
      Promise.reject("Fetch did not succeed");
    }
  }).then((json) => { 
    console.log(json.access_token)
    return json.access_token
  }).catch(err => console.log(err));
}

否则,只需 return 一个 Promise 在服务器中解析之后。喜欢,

服务器

async GetJSON(NewURLCode){
    return new Promise(async (resolve, reject) => {
        try {
            const httpResponse= await fetch("https://accounts.google.com/o/oauth2/token", {
                "method": "post",
                "headers": {
                    "Content-Type": 'application/x-www-form-urlencoded'
                },
                'body': data
           });

           if (httpResponse.ok) {
              const json = await httpResponse.json();
              resolve(res.access_token);
           } else {
              reject("Fetch did not succeed");
           }
        } catch(err) {
            reject(err);
        }
   });
}

客户端

GetJSON(NewURLCode).then(httpResponse => {
  console.log(httpResponse, 'fetch json')
}).catch(err => console.log(err));

错误不是因为return的语句,我在httpResponse.json();

前加了一个return

是因为WIX onReady组件调用了两次...

所以为了解决这个问题,我使用了以下 WIX solution :

$w.onReady(function () {
  if (wixWindow.rendering.env === "browser") {

//your code
}})