Cloudinary api - 解决承诺

Posted

技术标签:

【中文标题】Cloudinary api - 解决承诺【英文标题】:Cloudinary api - resolve promise 【发布时间】:2017-09-27 19:12:54 【问题描述】:

我想编写一个函数,它返回一个布尔值,指示具有指定 public_id 的图像是否已存在于我的 Cloudinary 空间中。

我可以使用以下代码将结果记录到控制台:

function isUploaded(public_id) 
  cloudinary.api.resource(public_id, function(response)
    console.log(response.hasOwnProperty('public_id'));
  );
;

isUploaded('test');

但是,我想将结果布尔值传递给另一个函数。使用 return 语句会导致 state: 'pending' 被记录:

function isUploaded(public_id) 
  return cloudinary.api.resource(public_id, function(response)
    return response.hasOwnProperty('public_id');
  );
;

console.log(isUploaded('test'));

这与 javascript Promises 有关。我似乎无法重组我的代码以使其工作。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

问题在于cloudinary.api.resource 异步运行(这就是它需要回调函数的原因)。

您可以让您的isUploaded 函数返回一个Promise,一旦调用该回调函数就会解析。

var cloudinary = require('cloudinary');

function isUploaded(public_id) 
  return new Promise(function (resolve, reject) 
    cloudinary.api.resource(public_id, function(response) 
      var isUploaded = response.hasOwnProperty('public_id');
      resolve(isUploaded);
    );
  );
;

isUploaded('test')
.then(function (result) 
  console.log(result);
)

【讨论】:

【参考方案2】:

请注意,api.resource() 是速率受限的(Admin API 的一部分),因此这不是一个“可扩展”的解决方案。

您可以执行 HEAD 请求并获取响应的 statusCode - 200 表示资源存在于您的帐户中,否则为 404。

例如——

var http = require('http')
var options = method: 'HEAD', host:'res.cloudinary.com',path:'/<cloud_name>/image/upload/<yourimage.jpg>' 
var req = http.request(options, function(res) console.log(res.statusCode););  
req.end();

【讨论】:

以上是关于Cloudinary api - 解决承诺的主要内容,如果未能解决你的问题,请参考以下文章

承诺按顺序运行嵌套承诺并在第一次拒绝时解决

解决承诺后,视图中的数据未更新

PromiseKit - 带有重新加载第一个承诺的可选承诺

Nodejs 异步承诺队列

FCC API 项目。我不明白带有承诺的代码流程

从承诺解决方案调用时,Vuex 商店未更新