<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>写意生活 &#187; bug</title>
	<atom:link href="http://x1989.com/a/tag/bug/feed" rel="self" type="application/rss+xml" />
	<link>http://x1989.com</link>
	<description>小谢的Blog — 认真生活 快乐工作 专注Web前后端开发&#124;移动平台</description>
	<lastBuildDate>Sat, 08 Oct 2011 10:21:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Kissy中jsonp api的bug</title>
		<link>http://x1989.com/a/387.html</link>
		<comments>http://x1989.com/a/387.html#comments</comments>
		<pubDate>Fri, 15 Apr 2011 11:56:57 +0000</pubDate>
		<dc:creator>xhowhy</dc:creator>
				<category><![CDATA[Web开发]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jsonp]]></category>
		<category><![CDATA[Kissy]]></category>

		<guid isPermaLink="false">http://x1989.com/?p=387</guid>
		<description><![CDATA[在相邻的代码里多次调用Kissy的jsonp方法，调用十次大概会出现六次的：Uncaught ReferenceError: jsonp1302852733609 is not defined(anonymous function).同事仙羽查看源码发现，是kissy的jsonp api是调用太快了，产生了同一个时间戳。。两次请求返回的都是同个函数调用，但是kissy里面的jsonp有个垃圾收集的处理，结果把这个函数给删了，第二次再调用的时候就调用不到了。算是kissy的bug吧，应该用guid的。出错代码如下

<span class="readmore"><a href="http://x1989.com/a/387.html" title="Kissy中jsonp api的bug">阅读全文——共263字</a></span>]]></description>
			<content:encoded><![CDATA[<p>在相邻的代码里多次调用Kissy的jsonp方法，调用十次大概会出现六次的：Uncaught ReferenceError: jsonp1302852733609 is not defined(anonymous function).同事仙羽查看源码发现，是kissy的jsonp api是调用太快了，产生了同一个时间戳。。两次请求返回的都是同个函数调用，但是kissy里面的jsonp有个垃圾收集的处理，结果把这个函数给删了，第二次再调用的时候就调用不到了。算是kissy的bug吧，应该用guid的。出错代码如下</p>
<pre>
for(var i=0;i<10;i++){
    KISSY.jsonp('http://110.75.14.39/home/recommendTmallSpu.htm?appID=87&#038;num=4&#038;key=110202',function(data){
        console.log(data);
    })
}
</pre>
<p>问题就出现在ajax模块下的这行代码：</p>
<pre>
jsonp = c['jsonpCallback'] || JSONP + S.now();
</pre>
<p>贴一段jQuery源码中的实现：</p>
<pre>
// 默认的发起jsonp请求的设置 即url中callback=?的情况 回调函数也是"jsonp_"+时间错
jQuery.ajaxSetup({
	jsonp: "callback",
	jsonpCallback: function() {
		return jQuery.expando + "_" + ( jsc++ );
	}
});

// 装载jsonp的callback函数
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {

	var dataIsString = ( typeof s.data === "string" );

	if ( s.dataTypes[ 0 ] === "jsonp" ||
		originalSettings.jsonpCallback ||
		originalSettings.jsonp != null ||
		s.jsonp !== false &#038;&#038; ( jsre.test( s.url ) ||
				dataIsString &#038;&#038; jsre.test( s.data ) ) ) {
                //响应容器
		var responseContainer,
			jsonpCallback = s.jsonpCallback =
				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
			previous = window[ jsonpCallback ],
			url = s.url,
			data = s.data,
			replace = "$1" + jsonpCallback + "$2",
			cleanUp = function() {
				window[ jsonpCallback ] = previous;
				// 当有请求时调用callback
				if ( responseContainer &#038;&#038; jQuery.isFunction( previous ) ) {
					window[ jsonpCallback ]( responseContainer[ 0 ] );
				}
			};

		if ( s.jsonp !== false ) {
			url = url.replace( jsre, replace );
			if ( s.url === url ) {
				if ( dataIsString ) {
					data = data.replace( jsre, replace );
				}
				if ( s.data === data ) {
					// Add callback manually
					url += (/\?/.test( url ) ? "&#038;" : "?") + s.jsonp + "=" + jsonpCallback;
				}
			}
		}

		s.url = url;
		s.data = data;

		// 装载callback
		window[ jsonpCallback ] = function( response ) {
			responseContainer = [ response ];
		};

		// Install cleanUp function
		jqXHR.then( cleanUp, cleanUp );
</pre>
]]></content:encoded>
			<wfw:commentRss>http://x1989.com/a/387.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

