0

我正在制作一个供个人使用的小型 Node.js 应用程序,它使用他们的匿名 API 将上传到我的 Twitter 帐户(pic.twitter.com 链接)的图片侧载到 imgur,用新获得的 imgur 替换 pic.twitter.com 链接链接并将他们的推文保存到磁盘。这是执行此操作的代码位:

var 
    jsdom   = require( 'jsdom' )
,   request = require( 'request' )
,   t_pic   = /http:\/\/pic.twitter.com\/([a-z0-9]+)/gi;

function rehostImage( match ) {
    request( match, function( e, r, b ) {
        if ( e ) throw e;
        jsdom.env(
            {
                html: b,
                scripts: ['http://code.jquery.com/jquery-1.7.2.min.js']
            }, 
            function( err, window ) {
                var $ = window.jQuery;
                request.post( 
                    'http://api.imgur.com/2/upload.json', 
                    { 
                        key: 'gh10z9DFZ009876E342dfsfd34234dszSD65XRV5',
                        image:$( '.twimg' ).find( 'img' ).attr( 'src' ) 
                    }, 
                    function( data ) { 
                        return data.upload.links.original; 
                    });
            });
    });
}

var tweets = [], i = 0;

/* code to GET twitter page using "request" goes here similar to rehostImage */

/* same jsdom boilerplate as in rehostImage function goes here to get 
   the jQuery handle on the page DOM. Once we get "$"... */

$( '.tweet-text' ).each( function() { 
    i++;
    tweets[ i ] = $( this ).html();
    if( tweets[i].match( t_pic ) ) { tweets[i].replace( t_pic, rehostImage ); }
});

代码试图做的很简单:

  1. 获取我的推特页面
  2. 解析任何 pic.twitter.com 链接的每条推文
  3. 获取该页面,遍历 DOM,找到图像 URL 并通过他们的匿名 API 上传到 imgur

问题是这里的正则表达式替换tweets[i].replace( t_pic, rehostImage )replace将函数作为第二个参数,其返回值用于替换匹配的字符串;在这种情况下,上传后的最终 imgur URLdata.upload.links.original替换了我推文中的 pic.twitter.com URL,然后我将其保存到本地磁盘。

当一切都通过回调异步发生时,我如何才能rehostImage返回到正则表达式替换?data.upload.links.original通常的方法是进行最后的操作,即正则表达式替换,并将其作为可以在之后运行的回调传递,data.upload.links.original但由于正则表达式替换是内联发生的,我不知道如何在这里应用该方法。

任何指针?

4

1 回答 1

1

如果您想推迟执行替换,直到异步调用返回,您可以使用$.deferred来实现。

这是您如何使用它的示例,您可能需要对其进行调整以适应您的特定行为。

首先,您需要一个延迟对象:

var deferred = $.Deferred();

然后你的异步函数需要返回一个承诺:

function rehostImage( match ) {
    // snip
    return deferred.promise();
}

您的替换回调将等待延迟解决:

tweets[i].replace(t_pic, function () {
    rehostImage().then(function (data) {
        // the callback you want to execute when the deferred resolves
    });
});

最后你的异步函数需要解决延迟:

function( data ) {
    deferred.resolve(data.upload.links.original); 
});
于 2012-08-06T19:56:28.040 回答