Cloudinary API - 解析 Promise

3
我想写一个函数,返回一个布尔值,指示在我的Cloudinary空间中是否已经存在指定public_id的图片。
我可以使用以下代码将结果记录到控制台:
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 Promise有关。我似乎无法重构我的代码使其正常工作。任何帮助将不胜感激。

2个回答

4
问题在于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);
})

1
请注意,api.resource() 受到速率限制(属于管理 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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接